《高性能网站建设进阶指南》阅读笔记 2
发布时间:2013-11-22 浏览:322打印字号:大中小
大部分Comet服务器或明显地减少每个线程的资源开销,或者使用微线程或进程。如ErlyComet
大多数使用Comet的Php web应用采用分离式(off-board),Php编写的客户端与使用另一门语言编写的服务端通信。
工具包:Dojo Toolkit 或者 js.io
8.2 Transport Techniques
8.2.1 Polling
每x 毫秒发出一个请求,检查是否有更新
setTimeout(function() {xhrRequest( {"foo" : "bar"})}, 2000);
function xhrRequest(data) {
var xhr = new XMLHttpRequest();
xhr.open("get", "http://localhost/foo.php", true);
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
//
}
};
xhr.send(null);
}
8.2.2 Long polling
Polling 可能会浪费http请求,并且消耗宝贵的CPU时间和带宽。即便数据更新间隔时间已知,polling可能会导致服务器端超负荷。服务器端还没有响应上一个数据请求,第2个或者第3个请求接踵而至,对服务器进行狂轰乱炸。
Long polling: 服务器端只有在有可用的新数据时才响应,保持一个所有未响应请求和它们对应连接的大集合。服务端通过: Transfer-Encoding:chunked 或 Connection:close响应来保持这些请求连接。
function longPoll(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange == function() {
if(xhr.readyState ==4) {
callback(xhr.responseText);
xhr.open('GET', url, true);
xhr.send(null);
}
}
xhr.open('POST', url, true);
xhr.send(null);
}
长连接的为您提:每台Apache服务器大约可以处理10 000个并发连接,而一个运行良好的Comet服务器应该有能力处理超过50 000个并发长连接,这在处理实时应用时是非常可取的。
8.2.3 Forever Frame
打开一个隐藏的Iframe,请求一个基于Http1.1 快编码的文档.
8.2.4 XHR Streaming
function xhrStreaming(url, callback) {
xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
var lastSize;
if(xhr.readyState > 2 ) {
newTextReceived = xhr.responseText.substring(lastSize);
lastSize = xhr.responseText.length;
callback(newTextReceived);
}
if(xhr.readyState == 4) {
xhrStreaming(url, callback);
}
8.2.5 websocket html5
8.3 Corss-Domain
Html5 postMessage
callback polling
JSONP polling
function callbackPolling(url, callback) {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url + "callback=callbackPolling.callback");
callbackPolling.callback = function(data) {
callbackPolling(url, callback);
callback(data);
};
document.getElementsByTagName("head")[0].appendChild(script);
}
http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ (八卦:麻球网,被盛大收购)
http://ajaxian.com/archives/jsonp-json-with-padding
http://ajaxpatterns.org/On-Demand_Javascript
8.4.1 Manging connections
FreeBSD/OS X 的 Kqueue
Linux 的 epoll
Windows 的 completions ports
主流语言中一些网络库封装成了一致且跨平台的API
C的libevent java.nio, twisted python
性能优化在不同情况下也大相径庭,比如聊天程序,有许多连接,但在任何一个特定时间内只有一小部分用户在接收信息。通过服务器端的连接共享管理大量闲置连接是有好处的。http://orbited.org 和 willowchat.org 做了深入的优化
实时股票报价监控应用程序,大量的连接不断地更细,很少有闲置连接的存在。Jetty/Lightstreamer/Liberator对这种情况作了优化。
8.4.3 portocols
Comet的连接只允许server -> client 通信或双向通信。
Bayeux Publish-Subscribe(pubsub)模型
随着websocket的兴起和处理百万级用户量的解决方案的出现,其复杂性会逐渐降低。